Тени - необходимый аттрибут любой реалистичной игры. Есть несколько способов создавать тени.
В этой главе будет рассказано о том как создать тени путем трасировки лучей. Вероятно, это
не самый шустрый способ, но качество и реалистичнось получающихся теней наивысши.
Итак, о том что же такое RayTrace.
Это тип расчетов, при которых от источника к каждой вершине
объекта проводится луч, далее исчется пересечение этих лучей с нужной плоскостью. В нашем
случае источником является лампочка, солнце или какой-нибудь другой источник света, объектом
является тело, отбрасывающее тень, а плоскость является поверхность на которрую отбрасывается
тень. Далее все точки пересечения лучей и плоскости соединяются - тень от одного полигона получена.
Итак, как же все это выглядит на практике. Я написал функцию, которая отбрасывает тени от объектов,
состоящих из треугольников:
Думаю все понятно, но на всякий случай приведу некоторые пояснения. Параметры функции
соответственно: масив вершин объекта, количество треугольников в объекте, плоскость,
на которую отбрасывается тень, и позиция источника света. С помощью функции
glColor4f можно менять густоту тени: чем больше непрозрачность, те гуще тень.
Далее расчитываются точки a, b и c, которые являются точками пересечения лучей и плоскости.
Затем если все лучи пересекли плоскость, прорисовываем тень.
Как вы могли заметить, у этого способа есть определенные недостатки. Тень появляется лишь
если все лучи пересекают плоскость. Статья об универсальных тенях будет написана отдельно.
Хотя описанный здесь способ подходит для 90% случаев.
Примечание №1: Если вы не уверенны в том что тень полностью будет лежать на поверхности
используйте буффер трафарета, так же, как и в главе о плоских зеркалах.
Примечание №2: Можно придать тени некоторую размытость, если по контуру провотить линии
со включеным Antialias'ингом. Главное следите за тем чтобы цвета тени и контура совпадали.
Не обошлось без демки. Это демонстрашка солнечных часов,
которая использует RayTrace тени.